home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / lollipop / lollipop.hqx / Lollipop v0.93 / output.tex < prev    next >
Text File  |  1992-11-17  |  25KB  |  711 lines

  1. % Output.tex copyright 1992 Victor Eijkhout
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%%%%%%%%%% O U T P U T %%%%%%%%%%%%%%%
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5.  
  6. \@GenericConstruct{PageGrid}
  7.  
  8. \newif\if@pagegrid@installed
  9. \ifini{\next@paragraph
  10.    {\if@pagegrid@installed \else 
  11.         \Wmessage{No page grid installed}\fi
  12.    }}
  13. \NewTrace:out
  14. \add@PageGrid@default{\text@constructno}
  15. \add@PageGrid@default{\has@marksyes}
  16.  
  17. \newtoks\user@overrides
  18. \def\add@user@override#1{\append@to@list{user@overrides}{#1}}
  19.  
  20. \newif\if@nubalanceren
  21. \newinsert\botins
  22.  
  23. %%%% Page counting
  24. %
  25. % \count0 is the paper counter: 
  26. %     is increased for every \shipout in the output routine
  27. % \count1 is the page counter:
  28. %     you can do with it whatever you like.
  29.  
  30. % This appears to the users as if \NewCounter:Page had been done.
  31. %
  32. \countdef\sheet@counter=0
  33. \csarg\countdef{\counter@name{Page}}=1 
  34. \CounterRepresentation:Page=1
  35. \newtoks\Page@RL %zwoeg, zwoeg!
  36. \SetCounter:Page=1
  37.  
  38. %%%% Tests
  39. %
  40. \DefineTest:IsRightPage
  41. \DefineTest:IsLeftPage
  42. \DefineTest:IsFirstPage
  43. \DefineTest:IsLastPage
  44. \DefineTest:FlushBottom
  45.  
  46. %% anonieme cs'en zijn in gebruik bij opbouw en gebruik %%
  47. % \tempdima : / klad; gebruikt voor hoofdmeting; daarna in \text@column
  48. % \tempdimc : / klad; gebruikt voor voetmeting
  49. % \cs@a : in gebruik door \haalitems
  50.  
  51. \def\slotpenalty{-10001}
  52.  
  53. \def\@pseudoif#1#2{\tempcounta\escapechar \noesc
  54.     \edef\cs@e{\let\CSname{if@\string#1}\CSname{if\string#2}}\cs@e
  55.     \escapechar\tempcounta}
  56. \@pseudoif\IsFirstPage\true \@pseudoif\IsLastPage\true
  57. \@pseudoif\IsRightPage\true
  58. \@pseudoif\IsLeftPage\false
  59.  
  60. \def\leftright@setup
  61.    {\csarg\ifodd{\counter@name{Page}}\relax 
  62.                 \IsRightPage:yes \IsLeftPage:no
  63.           \else \IsRightPage:no  \IsLeftPage:yes
  64.           \fi}
  65. \def\firstpage@setup{\def\cs@a{yes}
  66.     \edef\cs@b{\xp\get@placed\xp{\firstmark}{first@page}}
  67.     \ifx\cs@a\cs@b \IsFirstPage:yes \else \IsFirstPage:no \fi}
  68. \def\lastpage@setup
  69.     {\ifnum\outputpenalty=\slotpenalty\relax 
  70.         \Tmessage[out]{Last page}\IsLastPage:yes
  71.      \else \IsLastPage:no
  72.      \fi}
  73. \def\output@setup{\let\par\@par
  74.     \parindent\z@ \leftskip\z@ \rightskip\z@ \lineskip\z@
  75.     \@defaulteverypar \MainFont
  76.     \leftright@setup    \firstpage@setup    \lastpage@setup
  77.     \@colnum\@ne \output@set@page@width
  78.     \Tmessage[out]{Incoming text: (\the\ht\@cclv+\the\dp\@cclv) x
  79.                    \the\wd\@cclv}
  80.     }
  81.  
  82. %%%%%%%%%%%%%%%% Head, Foot, Body
  83. %
  84. % Separate boxes are allocated for the page
  85. % head, body, and foot.
  86. % Head and foot contain static material, the
  87. % body contains the text. The body can be empty.
  88. %
  89. \newbox\page@head@box \newtoks\page@head@toks
  90. \page@head@toks{}
  91. \add@PageGrid@default
  92.    {\page@head@toks={\setbox\page@head@box=\vbox\bgroup}}
  93. \newdimen\head@height
  94. \def\measure@head{\head@height=\ht\page@head@box
  95.     \advance\head@height\dp\page@head@box
  96.     \Tmessage[out]{Head measurement: \the\head@height}}
  97.  
  98. \newbox\page@foot@box \newtoks\page@foot@toks 
  99. \page@foot@toks{}
  100. \add@PageGrid@default{\page@foot@toks=
  101.               {\setbox\page@foot@box=\vbox\bgroup}}
  102. \newdimen\foot@height
  103. \def\measure@foot{\foot@height=\ht\page@foot@box
  104.     \advance\foot@height\dp\page@foot@box
  105.     \Tmessage[out]{Foot measurement: \the\foot@height}}
  106.  
  107. \def\goal@height@trace
  108.    {\tempdimb\text@height
  109.     \multiply\tempdimb\ifnum\user@n@cols=\m@ne\n@cols\else\user@n@cols\fi
  110.     \Tmessage[out]{Aim for  text height: \the\text@height\@space
  111.     \ifnum\user@n@cols>\m@ne (\the\user@n@cols\@space columns;
  112.                 total height: \the\tempdimb)
  113.     \else\ifnum\n@cols>\@ne (\the\n@cols\@space columns;
  114.                 total height: \the\tempdimb)
  115.     \fi\fi}}
  116.  
  117. \def\report@body@measurement{
  118.     \Tmessage[out]{Body measurement:
  119.         (\the\ht\page@body@box+\the\dp\page@body@box) 
  120.         x\the\wd\page@body@box}
  121.     \ifvoid\topins\else
  122.         \Tmessage[out]{Top inserts: \the\ht\topins+\the\dp\topins}\fi
  123.     \ifvoid\botins\else
  124.         \Tmessage[out]{Foot inserts: \the\ht\footins+\the\dp\footins}\fi
  125.     }
  126.  
  127. \newbox\page@body@box \newtoks\page@body@toks
  128. \page@body@toks{}
  129. \add@PageGrid@default
  130.    {\page@body@toks={\setbox\page@body@box=\vbox\bgroup}}
  131.  
  132. \def\finish@part@routines
  133.    {\append@to@list{page@head@toks}{\egroup\measure@head}
  134.     \append@to@list{page@foot@toks}{\egroup\measure@foot}
  135.     \append@to@list{page@body@toks}{\egroup}}
  136.  
  137. \newbox\whole@page
  138. \def\make@page{
  139.     \setbox\whole@page=\vbox 
  140.        {\box\page@head@box
  141.             \ifabut@head\nointerlineskip\fi
  142.             \ifabut@foot\tempdima\dp\page@body@box\fi
  143.         \box\page@body@box 
  144.             \ifabut@foot\ifvoid\page@foot@box\else
  145.                  \kern-\tempdima\relax\nointerlineskip\fi\fi
  146.         \box\page@foot@box}%\showbox\whole@page
  147.     }
  148.  
  149. % \vsize has two possibilities:
  150. % 1/ it is calculated dynamically by subtracting
  151. % body and foot height from the total page height.
  152. % If \vsize is different from \ht255, the page
  153. % is thrown back.
  154. % 2/ it is set and the page has whatever size results.
  155. %
  156. \newif\iftext@fits
  157. \def\see@if@text@fits
  158.    {{\multiply\text@height\n@cols 
  159.      \tempdima\text@height
  160.      \advance\tempdima-\vsize
  161.      \ifdim\tempdima<\z@ \tempdima=-\tempdima \fi
  162.      \ifdim\tempdima<.1pt\relax
  163.            \global\text@fitsyes
  164.            \Tmessage[out]{Page accepted.}
  165.      \else \global\text@fitsno
  166.            \Tmessage[out]{Text does not fit. (vsize=\the\vsize)}
  167.            \global\vsize=\text@height
  168.      \fi}}
  169.  
  170. % Multicolumn stuff
  171. % every PageGrid macro installs \n@cols, but the user
  172. % can specify a different number with \NumberOfColumns:x
  173. % This sets \user@n@cols which is usually -1
  174. %
  175. \newcount\n@cols \n@cols\@ne
  176. \newcount\@colnum
  177. \newcount\user@n@cols \user@n@cols\m@ne
  178. \Distance:GutterWidth=1cm
  179. \def\NumberOfColumns:#1
  180.    {\user@n@cols=\w@w{#1}\relax
  181.     \Tmessage[out]{Switch to \the\user@n@cols\@space columns}
  182.     \hsize\page@width 
  183.     \tempdima\GutterWidth \multiply\tempdima\user@n@cols
  184.     \advance\tempdima-\GutterWidth
  185.     \advance\hsize-\tempdima \divide\hsize\user@n@cols}
  186. \add@user@override{\ifnum\user@n@cols=\m@ne\else
  187.     \csarg\let{\output@routine @body}\trivial@body
  188.     \n@cols\user@n@cols
  189.     \Tmessage[out]{User override: \the\n@cols\@space columns.}%
  190.     \fi}
  191.  
  192. \def\trivial@body{\Tmessage[out]{Trivial multicolumn (\the\n@cols) setup}
  193.     \@colnum\@ne \splittopskip\topskip
  194.     \setbox\page@body@box\hbox{\text@column}
  195.     \@colnum\tw@
  196.     \ifnum\n@cols>\@ne 
  197.         \loop \setbox\page@body@box\hbox{\unhbox\page@body@box
  198.               \kern\GutterWidth \text@column}
  199.               \advance\@colnum\@ne
  200.               \ifnum\@colnum>\n@cols\else\repeat
  201.     \fi}
  202. \def\real@text@column{\begingroup\vbadness\@M
  203.     \setbox\z@
  204.     \ifnum\n@cols=\@ne
  205.         \vbox to \vsize{\boxmaxdepth\maxdepth
  206.                  \ifvoid\topins\else\unvbox\topins \fi
  207.                  \unvbox\@cclv
  208.                  \ifvoid\footins\else\unvbox\footins \fi}%
  209.         \Tmessage[out]{Column: \the\ht\z@+\the\dp\z@}%
  210.     \else
  211.         \vsplit\@cclv to \text@height
  212.         \Tmessage[out]{Column \the\@colnum: \the\ht\z@+\the\dp\z@}%
  213.     \fi \ifnum\badness=\@M\Wmessage{Underfull textcolumn}\fi
  214.     \box\z@ \endgroup}
  215.  
  216. \let\OriginalShipout\shipout \let\CurrentShipout\shipout
  217. \newif\ifCountSheets \CountSheetsyes
  218. \def\finish@off@page{\Tmessage[out]{Whole page:
  219.                         \the\ht\whole@page+\the\dp\whole@page}
  220.     {\def\protect{\noexpand\protect\noexpand}
  221.      \def\cprotect{\expandafter\string}
  222.      \normalesc
  223.      \ifsink@pages 
  224.        \message{Page sunk [\the\sheet@counter.\csarg\the
  225.                                      {\counter@name{Page}}]}
  226.        \deadcycles\z@
  227.      \else \CurrentShipout\box\whole@page
  228.            \ifCountSheets\global\advance\sheet@counter\@ne\fi
  229.      \fi
  230.      }
  231.     \global\step@counter{Page}
  232.     }  
  233. \def\shipout@and@unbox@remainder{
  234.     \iftext@fits \make@page \finish@off@page \fi
  235.     \ifvoid\@cclv \Tmessage[out]{Shipped out whole page}
  236.     \else \Tmessage[out]{Part of page not shipped: \the\ht\@cclv} 
  237.           \unvbox\@cclv 
  238.           \ifnum\outputpenalty=\@M\else\penalty\outputpenalty\fi
  239.     \fi
  240.     \iftext@fits \ifother@grid\install@next@page@grid
  241.                  \else\Tmessage[out]{Same grid once again.}\fi 
  242.     \fi}
  243.  
  244. \newif\ifsink@pages
  245. \sink@pagesno
  246. \let\NoPages\sink@pagesyes \let\PagesOut\sink@pagesno
  247.  
  248. % this is a mess. clear up please.
  249. \newtoks\page@options
  250. \def\options@to@pagepart
  251.    {\append@cs@to@list{page@\page@part @toks}\page@options
  252.               \page@options={}}
  253. \add@PageGrid@default{\csarg\newtoks{\@name @routine}
  254.     \def\@current@options@list{page@options}
  255.     \def\page@part{head}\page@options{}
  256.     }
  257.  
  258. \def\install@output@routine#1{{\globaldefs\@ne
  259.     \output=\xp{\csname#1@routine\endcsname}%
  260.     \def\output@routine{#1}%
  261.     \Tmessage[out]{Install output: #1 ---}%
  262.     \@pagegrid@installedyes
  263.     \csname#1@install@parameters\endcsname
  264.     }}
  265.  
  266. \newdimen\text@height
  267.  
  268. % During the load of this file we build up a list of
  269. % defaults and test. These are then turned into PageGrid@default
  270. % at the end of this file.
  271. \newtoks\otr@settings \newtoks\otr@conditions
  272. \def\add@otr@setting#1{\append@to@list{otr@settings}{#1}}
  273. \def\del@otr@setting#1{\del@tok@from@list{otr@settings}#1}
  274. \def\add@otr@condition#1{\append@to@list{otr@conditions}{#1}}
  275. \def\set@otr@stuff{\def\cs@e##1{
  276.     \edef\cs@f{\nxp\adds@PageGrid@default{\global##1={\the##1}}}
  277.     \cs@f}
  278.   \cs@e\otr@settings \cs@e\otr@conditions}
  279. %\showthe\otr@settings \showthe\otr@conditions
  280. %\showthe\PageGrid@defaults}
  281.        
  282. \def\@DefinePageGrid{\options@to@pagepart \finish@part@routines
  283.     \csarg\edef{\@name @install@parameters}{%
  284.           \vsize\the\height@toks\relax \set@topskip
  285.           \multiply\vsize
  286.             \nxp\ifnum\user@n@cols>\@ne\user@n@cols\relax
  287.             \nxp\else\the\n@cols\relax\nxp\fi
  288.           \hsize\the\width@toks\relax
  289.           \def\CSname{\@name @page@width}%
  290.                  {\the\width@toks\relax}%
  291.           \nxp\Tmessage[out]{Initial hsize: \nxp\the\hsize}%
  292.           \ifwidth@of@text 
  293.           \else \nxp\hsize@from@page@width
  294.                 \ifnum\the\n@cols>1 
  295.                     \divide\hsize\the\n@cols\relax\fi
  296.           \fi
  297.           \nxp\Tmessage[out]{Installed hsize: \nxp\the\hsize}%
  298.           }
  299.     \csarg\edef{\@name @otr@parameters}{%
  300.           \the\otr@settings
  301.           \xp\@empty\the\otr@conditions
  302.           \CSname{height@of@text\ifheight@of@text yes\else no\fi}%
  303.           \text@height\the\height@toks\relax
  304.           \CSname{width@of@text\ifwidth@of@text yes\else no\fi}%         
  305.           \n@cols\the\n@cols\relax}
  306.     \csarg\edef{\@name @head@foot}{\the\page@head@toks 
  307.           \the\page@foot@toks
  308.           \ifheight@of@text\else
  309.           \advance\text@height-\head@height 
  310.           \advance\text@height-\foot@height
  311.           \fi}
  312.     \csarg\edef{\@command @body}{\the\page@body@toks}
  313.     \csarg\edef{\@command}{%
  314.           \nxp\EjectPage
  315.           \nxp\install@output@routine{\@name}%
  316.           %\global\hsize= \ifseen@text \CSname{\@name @text@width}%
  317.           %           \else \CSname{\next@page@grid @text@width}%
  318.           %           \fi
  319.           \outer@start@commands \after@indent
  320.           }
  321.     \csarg\edef{\@name @routine}{
  322.       \nxp\Tmessage[out]{======== Output routine: \@name\@space ==========}
  323.       \nxp\output@setup 
  324.       \CSname{\@name @otr@parameters}
  325.       \nxp\the\user@overrides
  326.       \CSname{\@name @head@foot}
  327.       \nxp\goal@height@trace
  328.       \ifnum\n@cols=\z@ %% no text, trivial case.
  329.             \setbox\page@body@box\voidb@x 
  330.             \nxp\text@fitsyes
  331.       \else \nxp\ifragged@bottom\nxp\text@fitsyes
  332.             \nxp\else\nxp\see@if@text@fits\nxp\fi
  333.             \nxp\iftext@fits%\nxp\show
  334.               %\CSname{\@name @body}
  335.                \let\nxp\text@column\nxp\real@text@column
  336.                \CSname{\@name @body}
  337.                \nxp\report@body@measurement
  338.             \nxp\fi
  339.       \fi
  340.       \nxp\shipout@and@unbox@remainder
  341.       \nxp\Tmessage[out]{==========}%
  342.       }
  343.     \xp\install@output@routine\xp{\@name}
  344.     }
  345.  
  346. % not operative yet.
  347. \new@dimen{user@page@height}{\m@ne sp}
  348. \new@dimen{user@text@height}{\m@ne sp}
  349. \def\Height:#1=#2
  350.    {\switch {\if\EqualString{#1}}
  351.     {Page} {\user@page@height\w@w{#2}}
  352.     {Text} {\user@text@height\w@w{#2}}
  353.     {default} {\Wmessage{Unknown option: `Height:#1=#2'}}
  354.     \endswitch}
  355.  
  356. %-- height of page/text
  357. %
  358. % the \ifheight@of@text conditional is also used
  359. % during run time.
  360. %
  361. \newif\ifheight@of@text
  362. \newtoks\height@toks \newdimen\page@height
  363. \add@PageGrid@default{\height@of@textyes\height@toks{20cm}}
  364. \add@PageGrid@default{\let\text@lines\relax}
  365. \@PageGridOption{height}{
  366.     \switch {\if\EqualString{#1}}
  367.         {page}  {\height@of@textno}
  368.         {text}  {\height@of@textyes}
  369.         {lines} {\height@of@textyes
  370.               \edef\cs@e{\def\nxp\text@lines{\@w@w{#2}}}\cs@e}
  371.         {default} {\Wmessage{Strange modifier: `height:#1=#2'}}
  372.     \endswitch
  373.     \edef\cs@e{\nxp\height@toks={\@w@w{#2}}}\cs@e
  374.     }
  375. % Make sure that the \Height command is not used!
  376. \@PageGridNOOP{Height}
  377.  
  378. %%%%
  379. %
  380. % Width handling
  381. %
  382. \newif\ifwidth@of@text
  383. \newtoks\width@toks \newdimen\page@width
  384. \@PageGridOption{width}{
  385.     \switch {\if\EqualString{#1}}
  386.         {page} {\width@of@textno}
  387.         {text} {\width@of@textyes}
  388.         {default} {\Wmessage{Strange modifier: `width:#1=#2'}}
  389.     \endswitch
  390.     \edef\cs@e{\nxp\width@toks={\@w@w{#2}}}\cs@e
  391.     }
  392.  
  393. % Make sure that the \Width command is not used!
  394. \@PageGridNOOP{Width}
  395.  
  396. % At installation of the output routine, calculate the hsize
  397. % if the page width is given.
  398. %
  399. \def\hsize@from@page@width
  400.    {\def\text@column{\hskip\z@\relax}%
  401.     \let\maybe@to@page@width\relax
  402.     \the\page@body@toks %\showthe\page@body@toks 
  403.     \Tmessage[out]{Width page body minus text: \the\wd\page@body@box}%
  404.     \global\advance\hsize-\wd\page@body@box}
  405.  
  406. % At the start of the output routine, calculate the page width
  407. % from the hsize (which may have been tinkered with), or set to
  408. % routine-specific page width (which may also have been changed).
  409. %
  410. \def\output@set@page@width
  411.    {\ifwidth@of@text
  412.         \edef\text@column{\hskip\the\wd\@cclv\relax\hskip\z@\relax}%
  413.         \let\maybe@to@page@width\relax
  414.         \csn\output@routine @body\ecs
  415.         \page@width\wd\page@body@box
  416.         \Tmessage[out]{Deduced page width: \the\page@width}
  417.     \else \def\maybe@to@page@width{ to \page@width}
  418.         \page@width\csn\output@routine @page@width\ecs\relax
  419.     \fi}
  420.  
  421. %%%% Topskip
  422. % initially the outer topskip is picked up, unless
  423. % the option 'topskip' is given.
  424. %
  425. \add@PageGrid@default
  426.    {\edef\set@topskip
  427.       {\topskip\the\topskip\relax\splittopskip\topskip}}
  428. \@PageGridOption{topskip}{
  429.     \edef\cs@e
  430.        {\def\nxp\set@topskip{\topskip\@w@w{#1}\relax
  431.                      \splittopskip\topskip}}
  432.     \cs@e
  433.     }
  434. % ragged bottom the way it's done in plain TeX.
  435. \newif\ifragged@bottom
  436. \add@otr@setting{\ragged@bottomno}
  437. \@PageGridOption{raggedbottom}{
  438.     \del@otr@setting{\ragged@bottomno}
  439.     \add@otr@setting{\ragged@bottomyes}
  440.     \if\EmptyList{#1}\@add@toks{\var@topskip{60pt}}
  441.     \else\edef\cs@e{\nxp\@add@toks{\nxp\var@topskip{\@w@w{#1}}}}
  442.          \cs@e
  443.     \fi}
  444. \def\var@topskip#1{\tempdima\topskip\tempskipa\z@ plus #1\relax
  445.     \topskip\tempdima \advance\topskip\tempskipa
  446.     \splittopskip\topskip}
  447.  
  448. %-- textband
  449. \newif\ifin@textband \add@PageGrid@default{\in@textbandno}
  450. \@PageGridOption{textband}{
  451.     \switch {\if\EqualString{#1}}
  452.         {start} {\start@textband}
  453.         {stop}  {\stop@textband}
  454.         {default} {\Wmessage{Strange modifier `textband:#1'}}
  455.     \endswitch}
  456. \newdimen\text@width
  457. \def\start@textband
  458.    {\options@to@pagepart 
  459.     \b@group[textband]\@hmodeyes\in@textbandyes
  460.     \@add@toks{\hbox \maybe@to@page@width\bgroup}
  461.     }
  462. \def\stop@textband
  463.    {\@add@toks{\egroup} \e@group[textband]
  464.     \ifseen@text \before@textno
  465.              \def\page@part{body} \options@to@pagepart
  466.              \def\page@part{foot} 
  467.     \fi}
  468.  
  469. %-- band
  470. \newif\ifabut@foot \newif\ifabut@head
  471. \add@otr@setting{\abut@footno \abut@headno}
  472. \@PageGridOption{band}{
  473.     \switch {\if\EqualString{#1}}
  474.         {start} {\@add@toks{\hbox to \page@width\bgroup}
  475.               \b@group[band]\@hmodeyes
  476.               \def\block@closing{\@add@toks{\hfil\egroup}
  477.                   \e@group[band]}}
  478.         {invisible} {\@add@toks{\setbox\tempboxa
  479.                                 \hbox to \page@width\bgroup}
  480.               \b@group[band]\@hmodeyes
  481.               \def\block@closing{\@add@toks{\hfil\egroup}
  482.                   \ifbefore@text
  483.                       \@add@toks{\vtop to\z@{\kern\z@\box\tempboxa\vss}
  484.                                       \nointerlineskip}
  485.                       \del@otr@setting{\abut@headno}
  486.                       \add@otr@setting{\abut@headyes}
  487.                       %\global\abut@headyes
  488.                   \else  \@add@toks{\nointerlineskip
  489.                                       \vbox to\z@{\vss\box\tempboxa}}
  490.                       \del@otr@setting{\abut@footno}
  491.                       \add@otr@setting{\abut@footyes}
  492.                       %\global\abut@footyes
  493.                   \fi\e@group[band]}}
  494.         {stop}  {\block@closing}
  495.         {default} {\Wmessage{Strange modifier `band:#1'}}
  496.     \endswitch}
  497.  
  498.  
  499. %-- next page grid
  500. \newif\ifother@grid
  501. \add@PageGrid@default{\other@gridno}
  502. \add@otr@setting{\other@gridno}
  503. \add@otr@condition{\ifother@grid
  504.     \def\nxp\install@next@page@grid
  505.        {\nxp\install@output@routine{\next@page@grid}}%
  506.   \fi}
  507. \@PageGridOption{NextPageGrid}{\other@gridyes
  508.     \del@otr@setting{\other@gridno}
  509.     \add@otr@setting{\other@gridyes}
  510.     \def\next@page@grid{#1}
  511.     }
  512.  
  513. %-- text
  514. \add@PageGrid@default{\n@cols\z@}
  515. \newif\ifbefore@text 
  516. \newif\ifseen@text %this one is also used by 'external'
  517. \add@PageGrid@default{\before@textyes \seen@textno}
  518. \@PageGridOption{text}{\global\seen@textyes
  519.     \ifin@textband\else\Emessage{'text' has to be in 'textband'}\fi
  520.     \global\advance\n@cols\@ne
  521.     \@add@toks{\text@column}}
  522.  
  523. %%%%%%%%%%%%%%%%%%%%%%% user commands
  524.  
  525. \def\leegbladinvoegen{\@g@stapteller{Page}}
  526. \def\EjectPage{\vfil\eject}
  527. \def\ToRecto{\csarg\ifodd{\counter@name{Page}}\else\step@counter{Page}\fi}
  528. \def\ToVerso{\csarg\ifodd{\counter@name{Page}}\step@counter{Page}\fi}
  529.  
  530. % less useful user command (mostly for formatting the manual :-)
  531. %
  532. \newbox\saved@page@box \newdimen\saved@hsize \newcount\saved@pageno
  533. \newtoks\saved@mark@items
  534. \def\SuspendOutput{\xdef\saved@output@routine{\output@routine}%
  535.     \global\saved@hsize\hsize \global\saved@mark@items\mark@items
  536.     \global\saved@pageno\cs@counter@name{Page}%
  537.     \output{\global\setbox\saved@page@box\box\@cclv
  538.             \Tmessage[out]{Suspend output; 
  539.                saved (\the\ht\saved@page@box+\the\dp\saved@page@box)
  540.                x \the\wd\saved@page@box}%
  541.             \global\output{\Emessage{You should not call output now!}%
  542.                            \OriginalShipout\box\@cclv}}%
  543.     \eject
  544.     }
  545. \def\ResumeOutput
  546.    {\xp\install@output@routine\xp{\saved@output@routine}%
  547.     \global\hsize\saved@hsize \global\mark@items\saved@mark@items
  548.     \global\cs@counter@name{Page}\saved@pageno
  549.     \unvbox\saved@page@box
  550.     }
  551.  
  552. %%%%%%%%%%%%%%%% Marks
  553. %%%%
  554. \NewTrace:mark
  555. \def\FirstPlaced:#1 
  556.    {\Tmessage[mark]{First Placed #1 from \firstmark}%
  557.     \xp\get@placed\xp{\firstmark}{#1}}
  558. \def\PreviousPlaced:#1
  559.    {\Tmessage[mark]{Previous Placed #1 from \topmark}%
  560.     \xp\get@placed\xp{\topmark}{#1}}
  561. \def\LastPlaced:#1
  562.    {\Tmessage[mark]{Last Placed #1 from \botmark}%
  563.     \xp\get@placed\xp{\botmark}{#1}}
  564. \def\get@placed#1#2{%
  565.     \get@@placed{#2}#1{SM}{}$}% SM: StopMarker
  566. \def\get@@placed#1#2#3{\if\EqualStringX{#2}{SM}\xp\take@to@dollar
  567.     \else\if\EqualStringX{#1}{#2}%
  568.               \maybe@uppercase{#3}\xp\xp\xp\take@to@dollar
  569.          \else\xp\xp\xp\get@@placed\fi
  570.     \fi{#1}}
  571. \ifini{\newtoks\mark@items}
  572.       % \newtoks\mark@toks % is this one used?
  573.  
  574. \newif\ifhas@marks
  575. \add@generic@default{\has@marksno}
  576.     % only yes in heading and output routine.
  577.     % it seems that you can have page breaks at marks...
  578. \@GenericOption{nomarks}{\has@marksno}
  579. \def\add@mark@item#1{\csarg\newtoks{mark@toks@#1}%
  580.     \Tmessage[mark]{Adding mark item #1}%
  581.     \global\mark@items\xp{\the\mark@items{#1}}}
  582. \def\refresh@mark@item#1#2{\csarg\global{mark@toks@#1}{#2}}
  583. \def\get@mark@items#1{\if\EqualStringX{#1}{SM}%
  584.     \else{#1}{\csarg\the{mark@toks@#1}}\xp\get@mark@items
  585.     \fi}
  586. \def\place@mark{\mark{\xp\get@mark@items\the\mark@items{SM}}}
  587.  
  588. % this one should be defined in document.tex
  589. \add@mark@item{first@page}
  590.  
  591. % Page wide rule
  592.  
  593. \@PageGridOption{pagerule}{
  594.     \@add@toks{\hrule width\page@width\relax\nobreak}}
  595.  
  596. % Set default otr@settings and otr@conditions
  597. \set@otr@stuff
  598.  
  599. \endinput
  600.  
  601. 92/10/24 raggedbottom in progress
  602. 92/11/04 splittopskip made equal to topskip
  603. 92/11/14 messed with otr@xyz token lists
  604. 92/11/15 warning on underfull text column;
  605.            ragged bottom still not working properly
  606.  
  607.  
  608. %%%%%%%%%%%%%%%%%%%%%% Old Stuff; maybe useful, maybe not
  609.  
  610. \newskip\@topS \newskip\@botS
  611. {\noeol
  612. \othercr
  613. \gdef\topillustratie{\bgroup\othercr \@topill}
  614. \gdef\@topill:#1=#2^^M{\edef\cs@e{\gdef\CSname{@topS#1}{#2}}
  615.     \cs@e \global\advance\@topS #2\egroup}
  616. \gdef\botillustratie{\bgroup\othercr \@botill}
  617. \gdef\@botill:#1=#2^^M{\edef\cs@e{\gdef\CSname{@botS#1}{#2}}
  618.     \cs@e \global\advance\@botS #2\egroup}}
  619.  
  620. \def\@wisill{\global\@topS\z@ \global\@botS\z@
  621.     \csarg\gdef{@topS1}{\z@}\csarg\gdef{@botS1}{\z@}
  622.     \csarg\gdef{@topS2}{\z@}\csarg\gdef{@botS2}{\z@}
  623.     \csarg\gdef{@topS3}{\z@}\csarg\gdef{@botS3}{\z@}
  624.     }
  625. \@wisill
  626.  
  627. \newtoks\@stramienlijst
  628. \def\invoerpad{}
  629. \def\opmaak: #1\par{\@stramienlijst={}
  630.     \def\cs@a##1 {\eqstring{##1}{klaar}{}%
  631.        {\append@to@list{@stramienlijst}{\@probeerstramien ##1;}
  632.         \cs@a}}
  633.     \cs@a #1klaar }%% let op de significante spaties!!
  634.     %% en de spatie achter het laatste stramien komt van de ^^M
  635. \def\invoer: #1 {
  636.     \def\@probeerstramien ##1;{\csn ##1\ecs 
  637.         \message{Ik probeer het met opmaak: ##1}
  638.         \@installeertellers{##1}
  639.         \input \invoerpad#1.tex
  640.         \vfill\eject
  641.         \@bewaartellers{##1}
  642.         }
  643.     \the\@stramienlijst}
  644.  
  645. %% uitloop van vorige output routine
  646. % iftempf: als pagina geen uitloop gebruikt, direct eventuele
  647. %          uitloop leeg gooien.
  648. % laatste pagina: tempboxa <- vbox{unvcopy255}
  649. % er wordt een pagina uitgeworpen:
  650. %    - 255 is void: invoer is op, dus uitlopen 
  651. %                   als dit de laatste pagina was
  652. %    - 255 non-void: er is iets terug te werpen; dit was kennelijk niet
  653. %                   de laatste pagina, dus geen uitloop.
  654.  
  655. \newbox\@uitloop \newbox\@tempuitloop \newif\ifisereenuitloop
  656.     \Tmessage[out]{Aangetroffen uitloop: \the\ht\@uitloop+\the\dp\@uitloop}
  657.  
  658. %-- uitloop
  659. % mag alleen in kop of voet voorkomen.
  660. \setbox\@tempuitloop=
  661.         \vbox{\ifvoid\topins\else\unvcopy\topins\fi
  662.               \unvcopy\@cclv\kern\z@}
  663. \setbox\@tempuitloop=\hbox{}
  664. \@PageGridOption{uitloop}{\tempfyes 
  665.     \@add@toks{\Tmessage[out]{Uitloop wordt verwerkt.}% 
  666.           \copy\@uitloop 
  667.           }}
  668.  
  669.           \iftempd
  670.               \iftempc \Tmessage[out]{Eerste pagina, derhalve:}
  671.                        \@loopnietuit \else \@loopuit \fi
  672.           \else \Tmessage[out]{Niet de laatste pagina, derhalve:}
  673.                 \@loopnietuit \fi
  674.  
  675.           \iftempf \else \nxp\@uitloopwegwerpen \fi %geheugenbesparing.
  676.  
  677. \def\@loopuit{\global\isereenuitloopyes 
  678.     \global\setbox\@uitloop=\box\@tempuitloop
  679.     \Tmessage[out]{Uitloop: \the\ht\@uitloop+\the\dp\@uitloop}}
  680. \def\@loopnietuit{\global\isereenuitloopno \@uitloopwegwerpen}
  681. \def\@uitloopwegwerpen{
  682.     \Tmessage[out]{Uitloop weggegooid: \the\ht\@uitloop+\the\dp\@uitloop}
  683.     \global\setbox\@uitloop=\hbox{}}
  684.  
  685. %-- veld %% is deze nog nodig nu we 'tekstblok' generisch hebben?
  686. \@PageGridOption{veld}{
  687.     \eqstring{#1}{stop}%
  688.          {\@add@toks{\egroup}}%
  689.          {\@add@toks{\vtop\bgroup\kern0cm}
  690.           \eqstring{#1}{uitvullen}{}%
  691.                    {\@add@toks{\hsize=\w@w{#1}}
  692.                     \iftempc\advance\text@width-\w@w{#1}\fi}
  693.          }}
  694. %-- parallel Nog eens goed over nadenken.
  695. \@PageGridOption{parallel}{
  696.     \eqstring{#1}{stop}%
  697.          {\@add@toks{\vfil\egroup\egroup}}%
  698.          {\@add@toks{\vtop\bgroup\kern0cm
  699.                 \vbox to \vsize\bgroup}% dit is fout.
  700.           \eqstring{#1}{uitvullen}{}%
  701.                 {\iftempc\advance\text@width-\w@w{#1}\relax\fi
  702.                  \@add@toks{\hsize=\w@w{#1}}}
  703.           }}
  704. %-- kolommenbalanceren
  705. % heeft alleen zin voor meerkoloms uitvoer,
  706. % werkt alleen op laatste pagina
  707. \@PageGridOption{kolommenbalanceren}{
  708.     \eqstring{#1}{}{\tempgyes}{\csn tempg#1\ecs}}
  709.  
  710.